package com.example.springboot.config.netty;

import io.netty.util.collection.IntObjectHashMap;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 经过测算，IntObjectHashMap存储10000个数据，相对于hashMap的存储结构节约内存开销40%-60%
 * 1 它对于 key 使用的是 open addressing 策略，也就是开放寻址策略。
 * 2 开放寻址是一种策略，该策略也分为很多种实现方案，比如：
 *
 * 线性探测方法（Linear Probing）
 * 二次探测（Quadratic probing）
 * 双重散列（Double hashing）
 *
 * 从上面划线部分的最后一句话就可以知道，IntObjectHashMap 使用的就是 linear probing，即线性探测。
 * 3 这里就是初始两个数组，分别是 key[] 和 values[]，且这两个数组的容量是一样的
 * 4 前面提到了一个点是 key 可以使用原生的 int 类型而不用包装的 Integer 类型。
 * 现在我要揭示第二个点了：value 没有一些乱七八糟的东西，value 就是一个纯粹的 value。你放进来是什么，就是什么。
 * 你想想 HashMap 的结构，它里面有个 Node，封装了 Hash、key、value、next 这四个属性：
 *
 * 类似还有 LongObjectHashMap
 *
 * @Author:ChenZhangKun
 * @Date: 2022/9/10 10:13
 */
public class IntObjectMapDemo {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        IntObjectHashMap<Object> intObjectMap = new IntObjectHashMap<Object>(8);
        Class<? extends IntObjectHashMap> objectMapClass = intObjectMap.getClass();
        Method method = objectMapClass.getDeclaredMethod("hashIndex", int.class);
        method.setAccessible(true);
        for (int i = 0; i < 100; i++) {
            if (((Integer) method.invoke(intObjectMap, i)) == 7) {
                System.out.println(i + "index=" + method.invoke(intObjectMap, i));
                intObjectMap.put(i, new Object());
            }
        }
    }
}
